Quickstart

Binder

[1]:
import numpy as np
import matplotlib.pyplot as plt

import ipyvasp as ipv

Transform POSCAR

Let’s create some dummy POSCAR.

[2]:
poscar = ipv.POSCAR.new(
    [[0.5, 0.5, 0.0], [0.0, 0.5, 0.5], [0.5, 0.0, 0.5]],
    {"Ga": [[0.0, 0.0, 0.0]],"As": [[0.25, 0.25, 0.25]]},

    scale = 5
)

poscar.write("POSCAR") # need it later

site_kws = dict(alpha=1)
ax1, ax2, ax3 = ipv.get_axes((8,3),ncols=3, axes_3d=[0,1,2])

poscar.splot_lattice( ax = ax1, fill = False,label='original',
    site_kws=site_kws)

_ = poscar.transform(lambda a,b,c: (b+c-a, a+c-b, a+b-c)).transpose([1,2,0]) # bring a1 to x
print(poscar.last.data.metadata.TM)
poscar.last.splot_lattice( # .last points to last created POSCAR in transform
    ax=ax2, fill = False, color='red', label='transformed',
    site_kws=site_kws
)
poscar.last.splot_plane([1,1,0],1/2,ax=ax2)

poscar.transform(lambda a,b,c: (a-c,b-c,a+b+c)
).set_zdir([0,0,1]).splot_lattice(ax=ax3,color='red')

print(poscar.last.data.metadata.TM)
ax1.view_init(azim=-25, elev=15)
ax2.view_init(azim=-35, elev=15)
---------------------------------------------------------------------------
FileExistsError                           Traceback (most recent call last)
Cell In[2], line 8
      1 poscar = ipv.POSCAR.new(
      2     [[0.5, 0.5, 0.0], [0.0, 0.5, 0.5], [0.5, 0.0, 0.5]],
      3     {"Ga": [[0.0, 0.0, 0.0]],"As": [[0.25, 0.25, 0.25]]},
      4
      5     scale = 5
      6 )
----> 8 poscar.write("POSCAR") # need it later
     10 site_kws = dict(alpha=1)
     11 ax1, ax2, ax3 = ipv.get_axes((8,3),ncols=3, axes_3d=[0,1,2])

File /opt/hostedtoolcache/Python/3.8.18/x64/lib/python3.8/site-packages/ipyvasp/lattice.py:736, in POSCAR.write(self, outfile, **kwargs)
    733 @_sub_doc(plat.write_poscar)
    734 @_sig_kwargs(plat.write_poscar, ("poscar_data",))
    735 def write(self, outfile=None, **kwargs):
--> 736     return plat.write_poscar(self.data, outfile=outfile, **kwargs)

File /opt/hostedtoolcache/Python/3.8.18/x64/lib/python3.8/site-packages/ipyvasp/_lattice.py:296, in write_poscar(poscar_data, outfile, selective_dynamics, overwrite, comment, scale)
    294             f.write(out_str)
    295     else:
--> 296         raise FileExistsError(
    297             f"{outfile!r} exists, can not overwrite, \nuse overwrite=True if you want to chnage."
    298         )
    299 else:
    300     print(out_str)

FileExistsError: 'POSCAR' exists, can not overwrite,
use overwrite=True if you want to chnage.
[3]:
poscar.splot_bz(fill = True,color='skyblue', vectors=None,lw=0.1).set_axis_off()
ax = poscar.splot_kpath([(0,0,0), (1/4,1/2,-1/4), (0.5,0.5,0), (0,0,0), (0,0.5,0)],
    labels = ['Γ', 'K', 'X', 'Γ', 'L'], fmt_label=lambda lab: lab+'\n')
ax.view_init(azim=55, elev=25)
<Figure size 489.6x489.6 with 0 Axes>
[4]:
fig = poscar.iplot_bz(color='blue')
ipv.iplot2html(fig)
[4]:

K-Path

We can interplate kpath based on current POSCAR, it gives correct distance between points.

[5]:
poscar.get_kpath([
    (0,0,0,'Γ'),
    (1/4,1/2,-1/4,'K'),
    (0.5,0.5,0,'X'),
    (0,0,0,'Γ'),
    (0,0.5,0,'L')
    ], n=8)
Automatically generated using ipyvasp for HSK-PATH 0:Γ, 4:K, 5:X, 9:Γ, 12:L
        13
Reciprocal Lattice
    0.0000000000    0.0000000000    0.0000000000    0.076923
    0.0625000000    0.1250000000   -0.0625000000    0.076923
    0.1250000000    0.2500000000   -0.1250000000    0.076923
    0.1875000000    0.3750000000   -0.1875000000    0.076923
    0.2500000000    0.5000000000   -0.2500000000    0.076923
    0.5000000000    0.5000000000    0.0000000000    0.076923
    0.3750000000    0.3750000000    0.0000000000    0.076923
    0.2500000000    0.2500000000    0.0000000000    0.076923
    0.1250000000    0.1250000000    0.0000000000    0.076923
    0.0000000000    0.0000000000    0.0000000000    0.076923
    0.0000000000    0.1666666667    0.0000000000    0.076923
    0.0000000000    0.3333333333    0.0000000000    0.076923
    0.0000000000    0.5000000000    0.0000000000    0.076923
[6]:
poscar.get_kmesh(2,2,2, weight=0)
Generated uniform mesh using ipyvasp, GRID-SHAPE = [2,2,2]
        8
Reciprocal
    0.0000000000    0.0000000000    0.0000000000    0.000000
    1.0000000000    0.0000000000    0.0000000000    0.000000
    0.0000000000    1.0000000000    0.0000000000    0.000000
    1.0000000000    1.0000000000    0.0000000000    0.000000
    0.0000000000    0.0000000000    1.0000000000    0.000000
    1.0000000000    0.0000000000    1.0000000000    0.000000
    0.0000000000    1.0000000000    1.0000000000    0.000000
    1.0000000000    1.0000000000    1.0000000000    0.000000
[7]:
view = poscar.view_weas(colors={'Ga':'red','As':'blue'})
view
---------------------------------------------------------------------------
ModuleNotFoundError                       Traceback (most recent call last)
Cell In[7], line 1
----> 1 view = poscar.view_weas(colors={'Ga':'red','As':'blue'})
      2 view

File /opt/hostedtoolcache/Python/3.8.18/x64/lib/python3.8/site-packages/ipyvasp/lattice.py:436, in POSCAR.view_weas(self, **kwargs)
    433 @_sub_doc(weas_viewer)
    434 @_sig_kwargs(weas_viewer, ("poscar",))
    435 def view_weas(self, **kwargs):
--> 436     return weas_viewer(self, **kwargs)

File /opt/hostedtoolcache/Python/3.8.18/x64/lib/python3.8/site-packages/ipyvasp/lattice.py:216, in weas_viewer(poscar, sizes, colors, bond_length, model_style, plot_cell, origin, eqv_sites)
    188 def weas_viewer(poscar,
    189     sizes=1,
    190     colors=None,
   (...)
    195     eqv_sites = True,
    196     ):
    197     """
    198     sizes : float or dict of type -> float
    199         Size of sites. Either one int/float or a mapping like {'Ga': 2, ...}.
   (...)
    213     Read what you can do more with `WeasWidget` [here](https://weas-widget.readthedocs.io/en/latest/index.html).
    214     """
--> 216     from weas_widget import WeasWidget
    218     if len(poscar.data.positions) < 1:
    219         raise ValueError("Need at least 1 atom!")

ModuleNotFoundError: No module named 'weas_widget'

If you are not seeing interactive widget above, don’t worry! We’ve got you covered with a screenshot below:

[8]:
view.download_image('weas.png')
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[8], line 1
----> 1 view.download_image('weas.png')

NameError: name 'view' is not defined

GaAs

Live View of POSCAR Operations

op.png

Batch analysis using Files class.

[9]:
files = ipv.Files('.')
files
[9]:
Files(
  PosixPath('POSCAR'),
  PosixPath('quickstart.ipynb'),
  PosixPath('weas.png')
) 3 items
[10]:
files.summarize(lambda path: {'end': path.parts[-1]})
[10]:
end FILE
0 POSCAR POSCAR
1 quickstart.ipynb quickstart.ipynb
2 weas.png weas.png
[11]:
files.map(lambda p: p.suffix,to_df=True)
[11]:
0 1
0 POSCAR
1 quickstart.ipynb .ipynb
2 weas.png .png
[12]:
files.interactive(lambda file: print(file))
[12]:
[13]:
files.filtered('py')
[13]:
Files(
  PosixPath('quickstart.ipynb')
) 1 items

Example: View Lattice and BZ side by side

[14]:
import plotly.graph_objects as go
import ipyvasp as ipv
fs = ipv.Files('.','POSCAR')

@fs.interact(fig1 = go.FigureWidget(), fig2 = go.FigureWidget(),
    app_layout={"left_sidebar": ('file', 'fig2'), 'center':('fig1',),'pane_widths':[2,3,0]})
def view(file, fig1, fig2):
    pos = ipv.POSCAR(file)
    ipv.iplot2widget(pos.iplot_bz(), fig_widget=fig2)
    ipv.iplot2widget(pos.iplot_lattice(), fig_widget=fig1)
image.png